package com.sample.springbatch.common;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 分页对象
 * Created by zwg on 2016/5/16.
 */
public class MyPage<T> implements Serializable {

    private static final long serialVersionUID = 2986986743734171525L;
    /**
     * 默认的每页记录数，20
     */
    private static int DEFAULT_PAGE_SIZE = 20;

    /**
     * 每页的记录数
     */
    private int pageSize = DEFAULT_PAGE_SIZE;

    /**
     * 起始位置，当前页第一条数据在List中的位置，从0开始
     */
    private int start;

    /**
     * 结果列表，当前页中存放的记录，类型一般为List
     */
    private List<T> list;

    /**
     * 总记录数
     */
    private int total;

    private int pageTotal;

    private int pageNo;

    /**
     * 默认的构造方法
     */
    public MyPage() {
        this(0, 0, 20, new ArrayList<T>());
    }

    /**
     * 构造方法
     * @param start 起始位置
     * @param total 总记录数
     * @param pageSize 每页的记录数
     * @param list 结果列表
     */
    public MyPage(int start, int total, int pageSize, List<T> list) {
        this.start = start;
        this.total = total;
        this.pageSize = pageSize;
        this.list = list;
    }

    public MyPage(int pageNo, int pageSize, List<T> list){
        if(list==null || list.isEmpty()){
            this.start=0;
            this.total=0;
            this.pageSize=pageSize;
            this.list=new ArrayList<T>();
        }else{
            this.start = MyPage.getStartOfPage(pageNo,pageSize);
            this.total=list.size();
            this.pageSize=pageSize;
            if(this.start < this.total){
                int toIdx = this.start + this.pageSize > this.total ? this.total : this.start + this.pageSize;
                this.list = list.subList(this.start,toIdx);
            }else{
                this.list=new ArrayList<T>();
            }
        }
    }

    /**
     * 获取起始位置
     * @return 起始位置
     */
    public int getStart() {
        return start;
    }

    /**
     * 设置起始位置
     * @param start 起始位置
     */
    public void setStart(int start) {
        this.start = start;
    }

    /**
     * 获取结果列表
     * @return 结果列表
     */
    public List<T> getList() {
        return list;
    }

    /**
     * 设置结果列表
     * @param list 结果列表
     */
    public void setList(List<T> list) {
        this.list = list;
    }

    /**
     * 获取总记录数
     * @return 总记录数
     */
    public int getTotal() {
        return this.total;
    }

    /**
     * 设置总记录数
     * @param total 总记录数
     */
    public void setTotal(int total) {
        this.total = total;
    }

    /**
     * 获取每页的记录数
     * @return 每页的记录数
     */
    public int getPageSize() {
        return this.pageSize;
    }

    /**
     * 设置每页的记录数
     * @param pageSize 每页的记录数
     */
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    /**
     * 取总页数
     * @return 总页数
     */
    public int getTotalPageCount() {
        this.pageTotal = total % pageSize == 0 ? total / pageSize : total
                / pageSize + 1;
        return this.pageTotal;
    }

    /**
     * 取当前的页号
     * @return 当前的页号
     */
    public int getPageNo(){
        this.pageNo = start/pageSize+1;
        return this.pageNo;
    }

    /**
     * 该页是否有下一页.
     * @return boolean
     */
    public boolean hasNextPage() {
        return this.getPageNo() < this.getTotalPageCount() - 1;
    }

    /**
     * 该页是否有上一页.
     * @return boolean
     */
    public boolean hasPreviousPage() {
        return this.getPageNo() > 1;
    }

    /**
     * 获取任一页第一条数据在数据集的位置，每页条数使用默认值.
     * @see #getStartOfPage(int,int)
     * @param pageNo
     * @return
     */
    protected static int getStartOfPage(int pageNo) {
        return getStartOfPage(pageNo, DEFAULT_PAGE_SIZE);
    }

    /**
     * 获取任一页第一条数据在数据集的位置.
     *
     * @param pageNo   从1开始的页号
     * @param pageSize 每页记录条数
     * @return 该页第一条数据
     */
    public static int getStartOfPage(int pageNo, int pageSize) {
        return (pageNo - 1) * pageSize;
    }

    @Override
    public String toString() {
        return "Page [pageSize=" + pageSize + ", start=" + start
                + ", total=" + total + "]";
    }
}
